home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / pfdat.h.z / pfdat.h
C/C++ Source or Header  |  1992-04-03  |  7KB  |  188 lines

  1. /**************************************************************************
  2.  *                                      *
  3.  *          Copyright (C) 1989, Silicon Graphics, Inc.          *
  4.  *                                      *
  5.  *  These coded instructions, statements, and computer programs  contain  *
  6.  *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
  7.  *  are protected by Federal copyright law.  They  may  not be disclosed  *
  8.  *  to  third  parties  or copied or duplicated in any form, in whole or  *
  9.  *  in part, without the prior written consent of Silicon Graphics, Inc.  *
  10.  *                                      *
  11.  **************************************************************************/
  12. /*    Copyright (c) 1984 AT&T    */
  13.  
  14. /*    THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T    */
  15. /*    The copyright notice above does not evidence any       */
  16. /*    actual or intended publication of such source code.    */
  17.  
  18. #ifndef __SYS_PFDAT_H__
  19. #define __SYS_PFDAT_H__
  20. #ident    "$Revision: 3.28 $"
  21.  
  22. #include "sys/sema.h"
  23.  
  24. typedef struct pfdat {    /* pf_next and pf_prev MUST be first.    */
  25.     struct pfdat    *pf_next;    /* Next free pfdat.    */
  26.     struct pfdat    *pf_prev;    /* Previous free pfdat.    */
  27.     unsigned    pf_pageno : 24,    /* Disk block number.    */
  28.             pf_flags : 8;    /* Page flags.        */
  29.     union {
  30.         struct inode    *ip;    /* Page's incore inode.    */
  31.         struct {
  32.             short    indx;    /* Index into swaptab.    */
  33.             dev_t    dev;    /* Swap device.        */
  34.         } swap;
  35.     } p_un;
  36.     cnt_t        pf_use;        /* Share use count.    */
  37.     unsigned short    pf_rawcnt;    /* Count of processes    */
  38.                     /* doing raw I/O to page*/
  39.     time_t        pf_start;    /* Timestamp for delwri.*/
  40.     struct pfdat    *pf_hchain;    /* Hash chain link.    */
  41.     struct pfdat    *pf_pchain;    /* I/O queue.        */
  42. } pfd_t;
  43.  
  44. /*
  45.  * pf_ip and {pf_dev,pf_swpi} are overloaded because the ip
  46.  * is never used when swapping to a physical partition.
  47.  */
  48. #define pf_ip        p_un.ip
  49. #define pf_dev        p_un.swap.dev
  50. #define pf_swpi        p_un.swap.indx
  51.  
  52. /*
  53.  * pf_flags flags
  54.  */
  55. #define    P_QUEUE        0x01    /* Page on free queue        */
  56. #define    P_BAD        0x02    /* Bad page (parity error, etc.)*/
  57. #define    P_HASH        0x04    /* Page on hash queue        */
  58. #define P_DONE        0x08    /* I/O to read page is done.    */
  59. #define    P_SWAP        0x10    /* Page on swap (not file).    */
  60. #define    P_WAIT        0x20    /* Waiting for P_DONE        */
  61. #define    P_LOCK        0x40    /* Page manipulation lock.    */
  62. #define    P_DELWRI    0x80    /* Delayed write page        */
  63.  
  64. #define PAGELOCK(P)    (P)->pf_flags |= P_LOCK
  65. #define PAGEUNLOCK(P)    (P)->pf_flags &= ~P_LOCK
  66. #define ISPAGELOCKED(P)    ((P)->pf_flags & P_LOCK)
  67. /*
  68.  * The six free page lists define the state of the page, I-cache wise
  69.  */
  70. #define    CLEAN_ASSOC        0    /* Clean, disk association */
  71. #define    INTRANS_ASSOC        1    /* Being cleaned, no disk association */
  72. #define    STALE_ASSOC        2    /* Stale, disk association */
  73. #define    CLEAN_NOASSOC        3    /* Clean, no disk association */
  74. #define    INTRANS_NOASSOC        4    /* Being cleaned, disk association */
  75. #define    STALE_NOASSOC        5    /* Stale, no disk association */
  76.  
  77. #define    PH_NLISTS        6
  78.  
  79. /*
  80.  * List header type for free page table -- match link pointers in pfd_t.
  81.  */
  82. typedef struct plist {
  83.     struct pfdat    *pf_next;
  84.     struct pfdat    *pf_prev;
  85. } plist_t;
  86.  
  87. /*
  88.  * Free page table entry
  89.  */
  90. typedef struct phead {
  91.     plist_t    ph_list[PH_NLISTS];    /* list headers */
  92.     int    ph_count;        /* total count on all lists */
  93.     int    dummy[3];
  94. } phead_t;
  95.  
  96. /*
  97.  * Page wait semaphores.
  98.  */
  99. typedef struct pagewait {
  100.     sema_t    pwt_sema;        /* page wait semaphore    */
  101.     int    pwt_count;        /* wait counter        */
  102.     uint    pwt_waiters;        /* wait stats        */
  103.     uint    pwt_wakers;        /* wake stats        */
  104. } pfdwt_t;
  105.  
  106. #ifdef _KERNEL
  107.  
  108. extern sema_t    pinsert_lock;    /* lock on page hash additions    */
  109. extern sema_t    swapsema;    /* semaphore for all swap entries */
  110. extern lock_t    memory_lock;    /* lock for manipulationg memory*/
  111. extern pfd_t    *pfdat;        /* page frame database --    */
  112.                 /* allocated at bootup        */
  113. extern phead_t    *phead;        /* free page headers        */
  114. extern pfdwt_t    *pfdwait;    /* page wait semaphores        */
  115. extern pfd_t    **phash;    /* hash buckets for active pages*/
  116. extern pfd_t    **phashlast;    /* last hash bucket        */
  117. extern int    pheadmask;    /* free page hash mask        */
  118. extern int    phashmask;    /* active page hash mask    */
  119. extern int    pwaitmask;    /* page wait semaphore mask    */
  120. extern int    pdwrimem;    /* count of delayed write pages    */
  121. extern sema_t    upage_lock;    /* lock for upage allocations    */
  122. extern unsigned int cflush_gen;    /* cache flushing generation #    */
  123.  
  124. #define    pfdattophead(pfd)    (&phead[((pfd_t *)pfd - pfdat) & pheadmask])
  125. #define    pfdattopwt(pfd)        (&pfdwait[((pfd_t *)pfd - pfdat) & pwaitmask])
  126.  
  127. #define PHASH(PGNO,I)        (phash[((PGNO) + ((long)(I)>>5)) & phashmask])
  128. #define PDHASH(PGNO,I)        (phash[((PGNO) + ((long)(I)>>5)) & phashmask])
  129. #define NEXTPHASH(PL)        ((PL) >= phashlast ? &phash[0] : ((PL) + 1))
  130. #define PREVPDHASH(PL)        ((PL) == &phash[0] ? phashlast : ((PL) - 1))
  131. #define NEXTPDHASH(PL)        ((PL) >= phashlast ? &phash[0] : ((PL) + 1))
  132.  
  133. #define PGNULL        0    /* pf_pageno null value        */
  134.  
  135. #define pinsertlock()    psema(&pinsert_lock, PMEM);
  136. #define pinsertunlock()    { ASSERT(valusema(&pinsert_lock) <= 0); \
  137.               vsema(&pinsert_lock); }
  138. #define upagelock()    psema(&upage_lock, PZERO);
  139. #define upageunlock()    { ASSERT(valusema(&upage_lock) <= 0); \
  140.               vsema(&upage_lock); }
  141. #define swaplock()    appsema(&swapsema, PSWP);
  142. #define swapunlock()    apvsema(&swapsema);
  143.  
  144. extern int splhi(void);
  145. #define    rawmemlock()        splockspl(memory_lock, splhi)
  146. #define    rawmemunlock(T)        spunlockspl(memory_lock, T)
  147.  
  148. #define vcache(key,lpn)    (uint)(((uint)key >> 7) + lpn)
  149.  
  150. /* Function Prototypes */
  151.  
  152. extern pfd_t *pagealloc(uint, int);
  153. extern int pagefree(pfd_t *);
  154. extern pfd_t *pfind(struct region *, struct dbd *);
  155. extern pfd_t *pifind(struct inode *, daddr_t, int);
  156. extern pfd_t *pglock(pfd_t *);
  157. extern pfd_t *pdhfind(pfd_t **, struct inode *, unsigned);
  158. extern void pagewait(pfd_t *);
  159. extern void pagedone(pfd_t *);
  160. extern void pinsert(struct region *, struct dbd *, pfd_t *);
  161. extern void piinsert(struct inode *, daddr_t, pfd_t *);
  162. extern int premove(pfd_t *);
  163. extern int pbremove(struct region *, struct dbd *);
  164. extern int pattach(caddr_t);
  165. extern void prelease(int);
  166. extern int pflip(int, caddr_t);
  167. extern void ptossip(struct inode *, int, int);
  168. extern void pflushinvalip(struct inode *, int size);
  169. extern void ppuship(struct inode *);
  170. extern void pfluship(struct inode *, int);
  171. extern void pinvalfree(struct inode *);
  172. extern void pageuseinc(pfd_t *);
  173. extern void pageacquire(pfd_t *);
  174. extern void pageflags(pfd_t *, int, int);
  175. extern void pdinsert(pfd_t *);
  176. extern void delpop(struct inode *);
  177.  
  178. extern int reservermem(int);
  179. extern int reservemem(int, int, int);
  180. extern void waitrmem(int);
  181. extern void unreservemem(int, int, int);
  182. extern int requestmem(unsigned);
  183. extern void cancelmem(unsigned);
  184. extern void setsxbrk(struct proc *);
  185.  
  186. #endif /* _KERNEL */
  187. #endif /* !__SYS_PFDAT_H__ */
  188.